var fs = require('fs');

// convertit dtstart et dtend en Objet Date pour pouvoir comparer
function icalToDate(ligne)
{
                var debut = ligne.slice(ligne.indexOf(":") + 1 );
                var annee = debut.substr(0,4);
                var mois = parseInt(debut.substr(4,2),10)-1;
                var jour = debut.substr(6,2);
                var heure = debut.substr(9,2);
                var minute = debut.substr(11,2);
                var sec = debut.substr(13,2);
        
                return new Date(annee,mois, jour, heure, minute, sec);
}

//retourne vrai si il y a un conflit entre 2 evenements
//d1 debut evenement 1
//d2 debut evenement 2
//f1 fin evenement 1
//f2 fin evenement 2

function testDate(d1,d2,f1,f2)
{
        return((d2 <= d1 && d1 < f2) || (d2 < f1 && f1 <= f2) || (d2 <= d1 && f2 >= f1));
}

function afficherDoublons(icalendar){
        
        fs.readFile(icalendar, 'utf8', function (err,data) {
          if (err) {
                return console.log(err);
          }
          var isValide = true; 
          //on decoupe le fichier en events dans un tableau
          var events = data.split("BEGIN:VEVENT");
        //tabD est un tableau contenant les dates de debut d'evenements dans l'ordre, les fins sont dans tabF
          var tabD = [];
          var tabF = [];
        // la premiere case est le debut du fichier si il est conforme, on la supprime du tableau d'evemenement
          events.shift();
        
          var nbEvents = events.length;
          //on parcourt les events jusqu'a la fin on stocke les dates debuts dans tabD et les dates fin dans tabF
          for(var event = 0; event < nbEvents ; event++ ){
          
                //on lit le VEVENT      
                var lignes = events[event].split("\n");
                var ligneDebut = "";
                var ligneFin = "";
                var index=0;
                //on parcourt le VEVENT
                while(index<lignes.length){
                        //on verifie si la ligne commence par DTSTART ou DTEND
                        if(lignes[index].lastIndexOf("DTSTART:", 0) === 0){
                                ligneDebut = lignes[index];
                        } else if (lignes[index].lastIndexOf("DTEND:", 0) === 0){
                                ligneFin = lignes[index];
                        }
                        index++;
                }
                
                // creation d'un objet date (pour faciliter la comparaison plus tard)
                var DateDebut =  icalToDate(ligneDebut);
                tabD.push(DateDebut);
                // on stocke les dates debuts dans tabD et les dates fin dans tabF
                var DateFin =  icalToDate(ligneFin);
                tabF.push(DateFin);
                
                }
                //parcours de tous les events pour comparer
                for(var i=0;i<nbEvents;i++){
                        //pour chaque event, on le compare avec tous les autres
                        for(var j=i;j<nbEvents;j++){
                                // on affiche entre quels doublons l'erreur se produit
                                if(testDate(tabD[i],tabD[j],tabF[i], tabF[j]) && i!=j){
                                        console.log("Erreur de doublons sur les évènements numéros ", (i+1), " et ",(j+1)+".");
                                        isValide = false;
                                }
                        }
                }
                if(isValide)
                        console.log("Le fichier est valide");
        });
}
var file = process.argv[2]; //on récupère le fichier passé en argument

if(file==null || file.split(".").pop()!="ics"){
        console.log("ERREUR : vous devez entrer un fichier .ICS à exploiter.");
}else{
        afficherDoublons(file);
}